package com.lottery.im.view;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.annotation.DrawableRes;
import android.util.AttributeSet;
import android.widget.ImageView;

/**
 * 圆形图片控件
 */
@SuppressLint("AppCompatCustomView")
public class CircleImageView extends ImageView {
  private Bitmap mBitmap;
  private BitmapShader mBitmapShader;
  private Paint paint;
  private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
  private static final int COLORDRAWABLE_DIMENSION = 2;

  public CircleImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
  }

  @Override
  protected void onDraw(Canvas canvas) {
    if (mBitmap == null || mBitmapShader == null) {
      return;
    }
    if (mBitmap.getHeight() == 0 || mBitmap.getWidth() == 0) {
      return;
    }
    updateBitmapShader();
    paint.setShader(mBitmapShader);
    canvas.drawCircle(getWidth() / 2.0f, getHeight() / 2.0f,
        Math.min(getWidth() / 2.0f, getHeight() / 2.0f), paint);
  }

  private void init() {
    if (mBitmap == null) return;
    mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    paint = new Paint();
    paint.setAntiAlias(true);
  }

  @Override
  public void setImageBitmap(Bitmap bm) {
    super.setImageBitmap(bm);
    mBitmap = bm;
    init();
  }

  @Override
  public void setImageDrawable(Drawable drawable) {
    super.setImageDrawable(drawable);
    mBitmap = getBitmapFromDrawable(drawable);
    init();
  }

  @Override
  public void setImageResource(@DrawableRes int resId) {
    super.setImageResource(resId);
    mBitmap = getBitmapFromDrawable(getDrawable());
    init();
  }

  @Override
  public void setImageURI(Uri uri) {
    super.setImageURI(uri);
    mBitmap = uri != null ? getBitmapFromDrawable(getDrawable()) : null;
    init();
  }

  private Bitmap getBitmapFromDrawable(Drawable drawable) {
    if (drawable == null) {
      return null;
    }
    if (drawable instanceof BitmapDrawable) {
      return ((BitmapDrawable) drawable).getBitmap();
    }
    try {
      Bitmap bitmap;

      if (drawable instanceof ColorDrawable) {
        bitmap =
            Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
      } else {
        bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
            BITMAP_CONFIG);
      }
      Canvas canvas = new Canvas(bitmap);
      drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
      drawable.draw(canvas);
      return bitmap;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

  private void updateBitmapShader() {
    if (mBitmap == null) {
      return;
    }
    int canvasSize = Math.min(getWidth(), getHeight());
    if (canvasSize == 0) return;
    if (canvasSize != mBitmap.getWidth() || canvasSize != mBitmap.getHeight()) {
      Matrix matrix = new Matrix();
      float scale = (float) canvasSize / (float) mBitmap.getWidth();
      matrix.setScale(scale, scale);
      mBitmapShader.setLocalMatrix(matrix);
    }
  }
}
